home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / InterLaunch 1.1.2 / src / macppp / ppp.h < prev    next >
Text File  |  1996-07-06  |  25KB  |  751 lines

  1. /*
  2.  * Include file for MacPPP.  Should be pre-compiled with THINK C
  3.  *    to generate the ppp.h file.
  4.  *
  5.  * Copyright 1992-1993 Merit Network, Inc. and The Regents of the
  6.  *  University of Michigan.  Usage of this source code is restricted
  7.  *  to non-profit, non-commercial purposes.  The source is provided
  8.  *  "as-is", without warranty.
  9.  */
  10. #ifndef _PPP_H
  11. #define _PPP_H
  12.  
  13. #include <Timer.h>
  14.  
  15. /* uncomment this if you want alot of DebugStr statements */
  16. #define PPP_DEBUG_CHECKS(x)    /* DebugStr(x) */
  17. /* uncomment below if you want to log certain events to memory */
  18. /* #define LOG */
  19. #pragma options(check_ptrs)
  20.  
  21. #define    uchar(x) ((unsigned char)(x))
  22.  
  23. #include "MacTCP.h"
  24.  
  25. typedef struct LapInfo    LapInfo;
  26. typedef struct PPPiopb    PPPiopb;
  27. typedef struct sdiopb    sdiopb;
  28. typedef struct TMtimer    TMtimer;
  29.  
  30. #include "headers.h"        /* TCP/IP header structures */
  31. #include "slhc.h"
  32.  
  33. /* iopbs to queue transmit requests */
  34. #define    NUMIOPBS 24
  35.  
  36. /* define size for transmit fifo */
  37. #define XMITQLEN 256
  38. #define MAXXMIT 64
  39.  
  40. /* size for receive buffer (to get data from serial driver with PBRead) */
  41. #define RXBUFSIZE 192
  42.  
  43. /* size for receive driver input buffer */
  44. /* this needs to be fairly large for slow Macs to run at higher speeds */
  45. #define SDINBUFLEN 1024
  46.  
  47. #define PARAM_DOWN    0x81
  48. #define PARAM_UP    0x82
  49.  
  50. #define TASK_QUEUED 0x8000
  51.  
  52. /* Lap Transition events */
  53. #define    TransitionOpen  0L
  54. #define    TransitionClose 2L
  55.  
  56. /* Basic buffer structure */
  57. struct bufheader {
  58.     b_8        *dataptr;    /* pointer to start of data */
  59.     short    length;        /* length of data */
  60. };
  61.  
  62. #define    YANKBYTE(bufptr)\
  63.  (bufptr->length != 0 ? \
  64.  (bufptr->length--, *bufptr->dataptr++) : -1)
  65.  
  66. #define PPP_IP_PROTOCOL     0x0021
  67. #define PPP_VJ_COMP_PROTOCOL    0x002D
  68. #define PPP_COMPR_PROTOCOL    0x002D
  69. #define PPP_VJ_UNCOMP_PROTOCOL    0x002F
  70. #define PPP_UNCOMP_PROTOCOL    0x002F
  71. #define PPP_IPCP_PROTOCOL    0x8021
  72. #define PPP_LCP_PROTOCOL    0xC021
  73. #define PPP_PAP_PROTOCOL    0xC023
  74. #define HDLC_ALL_ADDR    0xff    /* HDLC all-station */
  75. #define HDLC_UI            0x03    /* HDLC Unnumbered Information */
  76. #define PPP_HDR_LEN    4    /* Max bytes for PPP/HDLC envelope header */
  77.  
  78. /* character defines */
  79. #define ENTER 3
  80. #define RETURN 13
  81. #define TAB 9
  82. #define BACKSPACE 8
  83.  
  84. /*
  85.  *  Timer
  86.  */
  87.  
  88. #define NULLTIMER    (struct TMtimer *)0
  89.  
  90. struct TMtimer
  91. {
  92.     TMTask            atm;        /* time manager task struct */
  93.     long            duration;    /* millisecond delay (must be positive) */
  94.     struct fsm_s    *fsm_p;        /* pointer to fsm to which this belongs */
  95.     ProcPtr        proc;        /* procedure to execute on timeout */
  96.     b_8                state;        /* state of the this timer */
  97. };
  98.  
  99. /* Timer states */
  100. #define TIMER_STOP    0
  101. #define TIMER_RUN    1
  102. #define TIMER_EXPIRE    2
  103.  
  104. struct TMprocess
  105. {
  106.     TMTask            atm;
  107.     union {
  108.         LapInfo            *lap;        /* place to save our lap pointer */
  109.         struct fsm_s    *fsm_p;        /* fsm pointer */
  110.     } tmsavptr;
  111. };
  112.  
  113. /*
  114.  *  PPP characters
  115.  */
  116.  
  117. enum {    PPP_FLAG    =   0x7E,   /* Opening/closing frame flag */
  118.     PPP_ESCAPE    =   0x7D   /* escape next character */
  119. };
  120.  
  121. typedef enum { s_Idle, s_Data, s_Escape, 
  122.                   s_Init, s_Finish, s_SendFCS, s_Loopback } HDLCState;
  123.  
  124. #define FCS_INIT    0xFFFF
  125. #define FCS_TERM    0xF0B8
  126. /* config packet header */
  127. struct config_hdr {
  128.     b_8 code;
  129. #define CONFIG_REQ     1
  130. #define CONFIG_ACK     2
  131. #define CONFIG_NAK     3
  132. #define CONFIG_REJ     4
  133. #define TERM_REQ     5
  134. #define TERM_ACK     6
  135. #define CODE_REJ     7
  136. #define PROT_REJ     8
  137. #define ECHO_REQ     9
  138. #define ECHO_REPLY    10
  139. #define DISCARD_REQ    11
  140.  
  141.     b_8 id;
  142.     b_16 len;
  143. };
  144. #define CONFIG_HDR_LEN    4    /* Length of config packet header */
  145.  
  146. /* config option header */
  147. struct option_hdr {
  148.     b_8 type;        /* protocol dependant types */
  149.     b_8 len;
  150. };
  151. #define OPTION_HDR_LEN    2    /* Length of option header */
  152.  
  153. /* Supported Configuration Protocol index */
  154. enum { Lcp, Pap, IPcp, fsmi_Size };
  155.  
  156. /* Protocol Constants needed by State Machine */
  157. struct fsm_constant_s {
  158.     b_16    protocol;        /* Protocol number */
  159.     b_8        fsmi;            /* Finite State Machine index */
  160.     b_8        try_req;        /* # of tries for config request */
  161.     b_8        try_nak;        /* # tries for nak substitutes */
  162.     b_8        try_terminate;    /* # tries for terminate */
  163.     b_8        *option_lengths;    /* ptr to array of option lengths */
  164.     b_8        option_limit;    /* # of options recognized */
  165.     b_8        timeout;        /* Time for timeouts (seconds)*/
  166. };
  167.  
  168. /* FSM states */
  169. enum { fsmINITIAL, fsmSTARTING, fsmCLOSED, fsmSTOPPED, fsmCLOSING, fsmSTOPPING,
  170.         fsmREQ_Sent, fsmACK_Rcvd, fsmACK_Sent, fsmOPENED, fsmState_Size };
  171.  
  172. /* State Machine Control Block */
  173. struct fsm_s {
  174.     b_8        state;            /* FSM state */
  175.     b_8        lastid;            /* ID of last REQ we sent */
  176.     b_8        retry;            /* counter for timeouts */
  177.     b_8        retry_nak;        /* counter for naks of requests */
  178.     LapInfo *lap;            /* place to stuff lap pointer */
  179.     struct    TMtimer timer;
  180.     struct    fsm_constant_s pdc;    /* protocol dependent constants */
  181.     void    *pdv;            /* pointer to protocol dependent variables */
  182. };
  183.  
  184. /* Link Phases */
  185. enum {
  186.     pppDEAD = 0,    /* Link Dead, Waiting for physical layer */
  187.     pppESTABLISH,    /* Link Establishment (LCP) phase */
  188.     pppAUTHENTICATE,    /* Authentication Phase */
  189.     pppNETWORK,        /* Network-Layer Protocol Phase */
  190.     pppTERMINATE,    /* Link Termination Phase */
  191.     pppPhase_Size
  192. };
  193.  
  194.                     /* LCP option types */
  195. #define LCP_MRU            0x01
  196. #define LCP_ACCM        0x02
  197. #define LCP_AUTHENT        0x03
  198. #define LCP_QUALITY        0x04
  199. #define LCP_MAGIC        0x05
  200. #define LCP_PFC            0x07
  201. #define LCP_ACFC        0x08
  202. #define LCP_OPTION_LIMIT    0x08    /* highest # we can handle */
  203. #define LCP_N_MRU        (1 << LCP_MRU)
  204. #define LCP_N_ACCM        (1 << LCP_ACCM)
  205. #define LCP_N_AUTHENT    (1 << LCP_AUTHENT)
  206. #define LCP_N_MAGIC        (1 << LCP_MAGIC)
  207. #define LCP_N_QUALITY    (1 << LCP_QUALITY)
  208. #define LCP_N_PFC        (1 << LCP_PFC)
  209. #define LCP_N_ACFC        (1 << LCP_ACFC)
  210.  
  211. /* Table for LCP configuration requests */
  212. struct lcp_value_s {
  213.     b_16    mru;            /* Maximum Receive Unit */
  214.     b_16    authentication;    /* Authentication protocol */
  215.     b_32    accm;            /* Async Control Char Map */
  216.     b_32    magic_number;    /* Magic number value */
  217. };
  218.  
  219. /* for test purposes, accept anything we understand in the NAK */
  220. #define LCP_NEG LCP_N_MRU | LCP_N_ACCM | LCP_N_AUTHENT | LCP_N_PFC | LCP_N_ACFC | LCP_N_MAGIC
  221.  
  222. /* Other configuration option values */
  223. #define LCP_ACCM_DEFAULT    0xffffffffL
  224. #define LCP_MRU_DEFAULT    1500
  225. #define LCP_MRU_HI    1500    /* High MRU limit */
  226. #define LCP_MRU_LO    128        /* Lower MRU limit */
  227.  
  228. #define PPP_OVERHEAD 8        /* room for addr, cntl, protocol and 32-bit FCS */
  229. #define    PPP_BUFSIZE LCP_MRU_HI + PPP_OVERHEAD /* size of buf for PPP packet */
  230.  
  231. #define LCP_NAK_TRY    10        /* NAK attempts */
  232. #define LCP_TERM_TRY 2        /* tries on TERM REQ */
  233.  
  234. /* PAP Parameters */
  235. #define PAPMESSLEN 128
  236. #define PAPUSERLEN 32
  237. #define PAPPASSLEN 32
  238.     /* PAP control block */
  239. struct pap_s {
  240.     b_8        username[PAPUSERLEN];    /* Username for REQ */
  241.     b_8        password[PAPPASSLEN];    /* Password for REQ */
  242.     b_8        message[PAPMESSLEN];    /* message from last ACK/NAK */
  243.     b_8        IOFlag;            /* flag to indicate userio necessary */
  244. };
  245.  
  246.  
  247.                     /* IPCP option types */
  248. #define IPCP_COMPRESS        0x02
  249. #define IPCP_ADDRESSES        0x01
  250. #define IPCP_ADDRESS        0x03    /* newer IP ADDRESS negotiation */
  251. #define IPCP_OPTION_LIMIT    0x03    /* highest # we can handle */
  252. #define IPCP_N_ADDRESS        (1 << IPCP_ADDRESS)
  253. #define IPCP_N_COMPRESS        (1 << IPCP_COMPRESS)
  254. #define IPCP_N_ADDRESSES    (1 << IPCP_ADDRESSES)
  255.  
  256. /* Table for IPCP configuration requests */
  257. struct ipcp_value_s {
  258.     b_32    address;        /* address for this side */
  259.     b_32    other;            /* address for other side */
  260.     b_16    compression;    /* Compression protocol */
  261.     b_16    slots;            /* Slots (0-n)*/
  262.     b_8        slot_compress;    /* Slots may be compressed (flag)*/
  263. };
  264.  
  265. /* for test purposes, accept anything we understand */
  266. #define IPCP_NEG  IPCP_N_ADDRESSES | IPCP_N_COMPRESS | IPCP_N_ADDRESS;
  267.  
  268. #define IPCP_SLOT_DEFAULT     16    /* Default # of slots */
  269. #define IPCP_SLOT_HI         16    /* Maximum # of slots (preallocated) */
  270. #define IPCP_SLOT_LO          1    /* Minimum # of slots */
  271. #define IPCP_SLOT_COMPRESS    0x01    /* May compress slot id */
  272. #define    MAXSLOTS IPCP_SLOT_HI    /* determine how much space to get */    
  273.  
  274. #define IPCP_NAK_TRY    10        /* NAK attempts */
  275. #define IPCP_TERM_TRY    2        /* tries on TERM REQ */
  276.  
  277. /*
  278.  *    local.want:    Options to request and desired values
  279.  *    local.will:    Options to accept in a NAK from remote.
  280.  *    local.work:    Options currently being negotiated.
  281.  *            Value is valid only when negotiate bit is set.
  282.  *    remote.want:    Options to suggest by NAK if not present in REQ.
  283.  *    remote.will:    Options to accept in a REQ from remote.
  284.  *    remote.work:    Options currently being negotiated.
  285.  *            Value is valid only when negotiate bit is set.
  286.  */
  287.  
  288. union value_s {
  289.     struct    lcp_value_s lcp_option;
  290.     struct    ipcp_value_s ipcp_option;
  291. };
  292.  
  293. struct option_s {
  294.     b_16            will_negotiate, want_negotiate;
  295.     union value_s    want;
  296.     b_16            work_negotiate;
  297.     union value_s    work;
  298. };
  299.  
  300. struct proto_s {
  301.     struct    option_s local, remote;
  302. };
  303.  
  304.  /* structure to queue writes */
  305.  
  306. struct PPPiopb {
  307.     QElemPtr    qLink;        /* next in queue */
  308.     short        qType;        /* qType field */
  309.     struct bufheader *bufptr;        /* ptr to buffer */
  310.     struct ipbuf    *ipbuf;        /* ptr to ipbuf */
  311. };
  312.  
  313. /* Data structure for PPP Preferences file */
  314. /* Note: This struct MUST map into the option_s structure !! */
  315.  
  316. struct lcp_will_want {
  317.     b_16    will_negotiate, want_negotiate;
  318.     struct    lcp_value_s want;
  319. };
  320.  
  321. struct lcpconfig {
  322.     struct lcp_will_want local, remote;
  323.     b_8        req_tries;
  324.     b_8        timeout;
  325. };
  326.  
  327. struct ipcp_will_want {
  328.     b_16    will_negotiate, want_negotiate;
  329.     struct    ipcp_value_s want;
  330. };
  331.  
  332. struct ipcpconfig {
  333.     struct ipcp_will_want local, remote;
  334.     b_8        req_tries;
  335.     b_8        timeout;
  336. };
  337.  
  338. #define MAXSLEN 42        /* max string length */
  339. #define NUMCOMMANDS 8    /* number of strings */
  340. #define PREF_VERSION 3    /* version of prefs file */
  341. #define NUMCONFIGS 4    /* number of configurations */
  342. struct ppp_pref {
  343.     b_16    version;        /* version of Preferences file */
  344.     b_8        portname[32];    /* port name (from CommToolBox) */
  345.     Boolean    hangup;            /* send modem hangup command on close */
  346.     Boolean    use_pulse;        /* use pulse for dialing */
  347.     Boolean quiet;            /* Quiet mode flag */
  348.     Boolean use_term;        /* bring up a terminal window on connection establishment */
  349.     b_16    timeout;        /* idle timeout (minutes), 0 = none */
  350.     b_16    echo;            /* PPP LCP echo interval  0 = off */
  351.     b_16    active_config;    /* active config index */
  352.     b_16    max_config;        /* maximum conifg index */
  353.     b_16    echo_tries;        /* number of echos before down */
  354.     b_16    max_window;        /* maximum window size */
  355. };
  356.  
  357. struct ppp_config {
  358.     struct    lcpconfig    lcpconf;
  359.     struct    ipcpconfig    ipcpconf;
  360.     b_8        pap_retries;                /* number of tries for PAP */
  361.     b_8        pap_timeout;            /* timeout for PAP */
  362.     b_16    connecttimeout;
  363.     b_16    waittimeout;
  364.     b_16    baudrate;        /* port speed */
  365.     b_8        flags;
  366. #define CTSBIT 0x1
  367. #define RTSBIT 0x2
  368. #define FLOWBITS CTSBIT+RTSBIT
  369. #define USE_PULSE 0x4
  370.     b_8        config_name[MAXSLEN + 1];        /* configuration name */
  371.     b_8        defaultid[MAXSLEN + 1];        /* add one for length byte */
  372.     b_8        defaultpw[MAXSLEN + 1];
  373.     b_8        modeminit[MAXSLEN + 1];
  374.     b_8        phonenum[MAXSLEN + 1];
  375.     struct {
  376.         Boolean    sendout;        /* should we send or wait for this string */
  377.         Boolean addreturn;        /* add a carriage return to end of string */
  378.         b_8        scriptstr[MAXSLEN + 1];    /* script string */
  379.     } commands[NUMCOMMANDS];
  380. };
  381.  
  382. struct IPCONFIG {
  383.     long        version;
  384.     long        flags;
  385.     long        dfl_ip_addr;
  386.     long        dfl_net_mask;
  387.     long        dfl_broadcast_mask;
  388.     long        dfl_gateway_addr;
  389.     unsigned char    server_lap_address[8];
  390.     long        configIPAddr;
  391.     long        configNetMask;
  392.     long        dfl_dyn_low;
  393.     long        dfl_dyn_high;
  394.     char        dfl_zone[33];        /* ### */
  395. /* align to word */
  396.     Byte        load;
  397.     Byte        admin;
  398.     Byte        netLock;
  399.     Byte        subnetLock;
  400.     Byte        nodeLock;
  401.     Byte        filler1;
  402.     long        activeLap;
  403.     long        slot;
  404.     char        filename[33];        /* ### */
  405. };
  406.  
  407. struct icmpEchoInfo {
  408.     unsigned long    echoRequestOut;    /* time when echo req. went out */
  409.     unsigned long    echoReplyIn;    /* time when echo reply received */
  410.     struct rdsEntry    echoedData;    /* data received in response */
  411.     Ptr        options;    /* IP Options */
  412.     unsigned long    userDataPtr;    /* userDataPtr for app stuff */
  413. };
  414.  
  415. typedef struct ipbuf {
  416.     IOParam        iop;        /* MAC OS I/O Param block */
  417.     struct icmpEchoInfo    echoInfo;    /* ping stuff */
  418.     struct ipbuf    *segipb;    /* pointer to segment's IPB if fragmented */
  419.     struct LapInfo    *lap;        /* LAP pointer */
  420.     ProcPtr        lap_ioc;     /* local net completion routine */
  421.     ProcPtr        ip_ioc;        /* IP completion routine */
  422.     ProcPtr        tp_ioc;        /* transport completion routine */
  423.     ProcPtr        data_ioc;    /* data IOC */
  424.     struct wdsEntry    laphdr;        /* local net header */
  425.     struct wdsEntry    ip;        /* IP header */
  426.     struct wdsEntry    tp;        /* TCP/UDP or ICMP header */
  427.     struct wdsEntry    data;        /* TCP/UDP data */
  428.     struct wdsEntry    d1;
  429.     struct wdsEntry    d2;
  430.     struct wdsEntry    d3;
  431.     struct wdsEntry    d4;        /* 8 wds entries plus 0 terminator */
  432.     short        flag;        /* zero terminator to WDS */
  433.     char        packet[];    /* start of variable length pkt */
  434. } ipbuf;
  435.  
  436. struct rdStruct {
  437.     ProcPtr    ph_rp;        /* pointer to "ReadPacket" routine (a4)    */
  438.     ProcPtr    ph_rr;        /* pointer to "ReadRest" routine 2(a4)    */
  439.     long    ph_bytesleft;    /* number of bytes left to read    */
  440.     union {
  441.         struct {    /* storage for standard AppleTalk LAP protocol handler */
  442.             long    phb_a4;        /* used by driver    */
  443.             long    phb_a0;        /* used by driver    */
  444.             long    phb_a1;        /* used by driver    */
  445.             long    phb_a2;        /* used by driver    */
  446.             } phb;
  447.         struct {    /* storage for a buffered LAP interface */
  448.             b_8    *lnb_ptr;    /* pointer to next byte to get from buffer    */
  449.             } lnb;
  450.         struct {    /* storage for a reassembled IP packet */
  451.             struct fragment    *rsmb_fragbuffer;    /* buffer to fragment data buffer */
  452.             b_8    *rsmb_ptr;    /* pointer to next byte to get from buffer */
  453.             long    rsmb_bytesleft;    /* number of bytes left in this buffer */
  454.             long    rsmb_byteoffset;/* offset of next byte in rsm'd pkt */
  455.             } rsm;
  456.         } rdsparm;
  457.     Byte    lapBroadcast;    /* LAP-level broadcast */
  458.     Byte    ipBroadcast;    /* IP-level broadcast */
  459.     struct LapInfo    *lap;
  460.     struct wdsEntry    laphdr;    /* local net header */
  461.     struct wdsEntry    ip;    /* ip header !!! (IPwdsEntry) ???*/
  462.     struct wdsEntry    tp;    /* TCP/UDP or ICMP header */
  463.     struct wdsEntry    data;    /* TCP/UDP data */
  464. };
  465.  
  466. struct sdiopb {
  467.     IOParam        iop;    /* IOPB for serial driver use */
  468.     LapInfo        *lap;    /* ptr to LapInfo */
  469.     };
  470.     
  471. typedef unsigned long (*longProcPtr)();
  472.  
  473. #define BUFOFFSET sizeof(struct bufheader) + sizeof(struct ipheader) + sizeof(struct tcpheader)
  474. #define    BUFFERSIZE PPP_BUFSIZE + BUFOFFSET
  475. #define NUMBUFFERS 4    /* number of buffers to allocate */
  476. #define LCP_ECHO_BUFSIZE 12 /* buffer size for lcp echo requests */
  477.  
  478. struct LapInfo {
  479.     b_32        cur_ip_addr;    /* LAP's IP address */
  480.     b_32        cur_net_mask;    /* LAP's IP net-mask */
  481.     b_32        ip_broadcast_addr;    /* IP's broadcast address */
  482.     struct IPCONFIG    lc;        /* copy of IP LAP cnfg rsrc */
  483.     ProcPtr    lapInit;    /* ptr to LAP init routine */
  484.     ProcPtr    lapOpen;    /* LAP open rtn */
  485.     ProcPtr    lapClose;    /* LAP close rtn */
  486.     ProcPtr        lapUnload;    /* LAP unload rtn, undoes lapInit */
  487.     ProcPtr    lapAttach;    /* LAP attach PH rtn */
  488.     ProcPtr    lapDetach;    /* LAP detach PH rtn */
  489.     ProcPtr    lapOutput;    /* LAP output rtn */
  490.     ProcPtr    lapControl;    /* LAP control rtn */
  491.     ProcPtr        lapFault;    /* LAP fault isolation rtn */
  492.     ProcPtr    lapStatistics;    /* LAP statistic reading rtn */
  493.     ProcPtr        lapConfigure;    /* LAP configuration rtn */
  494.     ProcPtr    lapProbe;    /* send a LAP-specific addr probe pkt */
  495.     ProcPtr    lapRegister;    /* register our IP address on net */
  496.     ProcPtr        lapFindGateway;    /* LAP-specific way to find gateway  */
  497.     ProcPtr    lapGwyCheck;    /* LAP-specific way to gateway is up */
  498. /* IP Parameters */
  499.     ip_addr        dfl_dns_addr;    /* addr of DNS from config protocol */
  500.     Handle        dnslHndl;    /* handle to DNS config rsrc */
  501.     Ptr            dnsCache;    /* ptr to DNS cache area */
  502.     long        dnsCacheSize;    /* size of cache in bytes */
  503. /* LAP Parameters */
  504.     long        headerSize;    /* LAP header space required */
  505.     long        trailerSize;    /* LAP trailer space required */
  506.     long        outMaxPacketSize;    /* max output packet size */
  507.     long        inMaxPacketSize;    /* max input packet size */
  508.     long        maxDataSize;    /* max size of data packet */
  509.     long        numConnections;    /* number of separate net connections */
  510.     unsigned long    versionFlags;    /* version number flags */
  511.     ProcPtr    ip_ph;        /* ptr to IP protocol handler */
  512.     Ptr            ipGlobals;    /* ptr to IP's A5 */
  513.     short        link_unit;    /* unit number of link driver */
  514.     Byte        addressConflict;    /* TRUE is address conflict */
  515.     long        lapType;    /* IP LAP hardware type # */
  516.     long        lapAddrLength;    /* size of LAP address field */
  517.     unsigned char     *lapAddrPtr;    /* ptr to LAP address field */
  518.     unsigned long    reserved;    /* MacTCP reserved field */
  519.     /* PPP specific storage */
  520.     Boolean        ok_to_xmit;    /* ok to transmit on serial port */
  521.     Boolean        term_mode;    /* terminal emulation flag */
  522.     Boolean        needTxPrime;    /* transmit routine needs to be primed */
  523.     Boolean        HasDeferredTasks;    /* indicates if Deferred Tasks available */
  524.     short        serinrefnum;    /* serial input ref num */
  525.     short        seroutrefnum;    /* serial output ref num */
  526.     b_8            rxbuf[RXBUFSIZE];    /* small receive buffer to get data from driver */
  527.     longProcPtr    transProc;    /* ptr to transition Proc */
  528.     longProcPtr savProc;    /* place to save a copy of transition proc pointer */
  529.     Ptr            LapA4;        /* holder for LAP's A4 */
  530.     HDLCState    read_state;    /* state of PPP receiver */
  531.     HDLCState    write_state;    /* state of PPP transmitter */
  532.     short        echo_count;    /* count of outstanding LCP echo requests */
  533.     short        idle_timer;    /* number of idle minutes */
  534.     short        writerr;    /* error on write. Who knows what */
  535.     short        readerr;    /* receiver errors */
  536.     OSErr        lasterr;    /* rc of last PBRead != noErr */
  537.     short        outofiopbs;    /* write failed; too many dgs q'd */
  538.     short        faults;        /* PPPFault was called. */
  539.     short        OutofBuffers;    /* # of getbuffer failures */
  540.     long        OutTxOctetCount;/* # octets sent */
  541.     long        OutOpenFlag;    /* # of open flags sent */
  542.     short        OutError;        /* # packets with error on send */
  543.     long        InRxOctetCount;    /* # octets received */
  544.     long        InOpenFlag;        /* # of open flags */
  545.     short        InUnknown;        /* # unknown packets received */
  546.     short        InCheckSeq;        /* # packets with bad check sequence */
  547.     short        InFramingErr;    /* # framing errors */
  548.     short        InError;        /* # packets with other error */
  549.     short        InIdleToss;        /* non-flag chars while Idle */
  550.     short        InHeader;        /*  Header errors */
  551.     short        InFrameOvr;        /* frame overrun */
  552.     short        InSoftOvr;        /* software overrun */
  553.     short        InHardOvr;        /* hardware overrun */
  554.     struct bufheader    *bufptr; /* current buffer for receive data */
  555.     b_8            *rddata;        /* pointer to end of data in rcv. buffer */
  556.     b_8            xbuf[8];        /* small buffer for copying to fifo */
  557.     struct { 
  558.         b_8        block[BUFFERSIZE];
  559.     } blockarray[NUMBUFFERS];    /* storage for memory blocks */
  560.     struct bufheader *buflist;    /* pointer to buffer list */
  561.     struct {                    /* a small buffer for LCP echo requests */
  562.         struct bufheader header;    /* a fake header for the buffer */
  563.         b_8        buffer[LCP_ECHO_BUFSIZE];    /* the actual buffer */
  564.     } lcp_echo_buf;
  565.     QHdr        out_q;            /* q of packets to write */
  566.     QHdr        pppbq;            /* Q of free PPPiopbs */
  567.     PPPiopb        *active;        /* current PPPiopb to transmit */
  568.     PPPiopb        pppiopbs[NUMIOPBS];    /* define storage for iopbs */
  569.     sdiopb        w_iopb;            /* IOPB for serial port writes */
  570.     sdiopb        r_iopb;            /* IOPB for serial port reads */
  571.     CntrlParam    stat_pb;        /* cntrlParam block for status calls */
  572.     struct rdStruct        rds;    /* for passing to ip layer */
  573.     struct ppp_pref    prefdata;    /* Data from Preferences file */
  574.     struct ppp_config configdata;    /* more preferences */
  575.     b_32        PPP_RecvACM;    /* Async Control maps */
  576.     b_32        PPP_XmitACM;
  577.     b_32        PPP_activeACM;    /* current active transmit ACCM */
  578.     b_16        fcstab[256];    /* FCS table for quicker FCS's */
  579.     b_16        XmitFCS;        /* FCS for current transmit frame */
  580.     b_16        RecvFCS;        /* FCS for current rx frame */
  581.     struct    NMRec        closenmtask;    /* Notification task record to close link */
  582.     struct    TMprocess    rxp_task;    /* receive processing task structure */
  583.     struct    TMprocess    txp_task;    /* transmit process task structure */
  584.     struct  TMprocess    echo_task;    /* LCP echo process */
  585.     struct    TMprocess    timeout_task;    /* idle timeout process */
  586.     DeferredTask defer_tx, defer_rx, defer_txcomplete;
  587.     b_8        sdinbuf[SDINBUFLEN]; /* input buffer for serial driver receive */
  588.     b_16    XmitQHead;            /* transmit queue head index */
  589.     b_16    XmitQTail;            /* transmit queue tail index */
  590.     b_16    XmitQSize;            /* transmit queue size */
  591.     b_8        XmitQ[XMITQLEN];    /* transmit queue */
  592.     struct proto_s    lcp_i, ipcp_i;
  593.     struct pap_s    pap_i;
  594.     b_8        ppp_phase;            /* phase of link initialization */
  595.     b_8        ppp_id;                /* id counter for connection */
  596.     b_32    ppp_upsince;        /* Timestamp when Link Opened */
  597.     b_8        ppp_flags;
  598. #define PPP_AP_REMOTE    0x01    /* remote authentication */
  599. #define ECHO_FAIL        0x02    /* LCP echo timeout */
  600. #define IDLE_TIMEOUT    0x04    /* idle timeout */
  601. #define CLOSE_PPP        0x08    /* close PPP flag */
  602.     struct fsm_s ppp_fsm[fsmi_Size];    /* finite state machines */
  603.     struct slcompress    comp;
  604.     struct cstate    rcvslots[MAXSLOTS],txslots[MAXSLOTS];
  605.     b_8        *lcp_option_length_p; /* lcp option lengths */
  606.     struct    lcp_value_s *lcp_default_p;    /* pointer to default option values */
  607.     b_8        *ipcp_option_length_p; /* ipcp options lengths */
  608.     struct    ipcp_value_s *ipcp_default_p;    /* pointer to default option values */
  609. #ifdef LOG
  610.     int        *logp;
  611.     int        log[5*100];
  612.     int        logend;
  613.     int        cushion[10];
  614. #endif
  615. };
  616.  
  617. typedef struct LapStats {
  618.     short    ifType;
  619.     char    *ifString;
  620.     short    ifMaxMTU;
  621.     long    ifSpeed;
  622.     short    ifPhyAddrLength;
  623.     char    *ifPhysicalAddress;
  624.     union {
  625.             char *noarp;
  626.             } AddrXlation;
  627.     short    slotNumber;
  628. };
  629.     
  630. /* Prototypes and declarations for routines */
  631.  
  632. /* lap.c */
  633. OSErr     PPPInit(    LapInfo *, longProcPtr);
  634. OSErr     PPPOpen(    LapInfo *);
  635. OSErr     PPPClose(    LapInfo *);
  636. void    PPPUnload(    LapInfo *);
  637. OSErr     PPPAttachPH(    LapInfo *, ProcPtr);
  638. OSErr     PPPDetachPH(    LapInfo *);
  639. OSErr     PPPWrite(    LapInfo *, ip_addr, struct ipbuf *);
  640. OSErr     PPPControl(    LapInfo *);
  641. void     PPPFault(    LapInfo *, ip_addr);
  642. void     PPPConfigure(    LapInfo *);
  643. Boolean    PPPProbe(    LapInfo *, ip_addr);
  644. Boolean    PPPRegister(    LapInfo *);
  645. void    PPPFindGW(    LapInfo *);
  646. OSErr     PPPStatistics(    LapInfo *, struct LapStats *);
  647.  
  648. /* misc.c: */
  649. void    AppendStr(b_8 *, b_8 *);
  650. struct bufheader *getbuffer();
  651. void    release(struct bufheader *);
  652. void    makeroom(struct bufheader *, b_16);
  653. b_16    yankbuf(struct bufheader *, b_8 *, b_16);
  654. short    yankbyte(struct bufheader *);    /* returns -1 if nothing */
  655. long    yank16(struct bufheader *);    /* returns -1 if nothing */
  656. b_32    yank32(struct bufheader *);    /* returns  0 if nothing */
  657. short    bytecmp(b_8 *, b_8 *, short);
  658. b_16    get16(b_8 *);
  659. b_32    get32(b_8 *);
  660. b_8        *put16(b_8 *, b_16);
  661. b_8        *put32(b_8 *, b_32);
  662. void    tcp_window_fix(LapInfo *, struct bufheader *);
  663.  
  664. /* fsm.c */
  665. void    htoncnf(struct config_hdr *, struct bufheader *);
  666. short    ntohcnf(struct config_hdr *, struct bufheader *);
  667. short    ntohopt(struct option_hdr *, struct bufheader *);
  668.  
  669. short    fsm_sendtermreq(struct fsm_s *);
  670. short    fsm_sendtermack(struct fsm_s *, b_8);
  671. void    fsm_reset(struct fsm_s *);
  672. void    fsm_tld(struct fsm_s *);
  673. void    fsm_tlu(struct fsm_s *);
  674. void    fsm_tlf(struct fsm_s *);
  675. void    fsm_tls(struct fsm_s *);
  676. void    fsm_no_action(struct fsm_s *);
  677. short    fsm_no_check(struct fsm_s *, struct config_hdr *, struct bufheader *);
  678. void    fsm_log(struct fsm_s *, char *);
  679. void    fsm_timer(struct fsm_s *);
  680. void    fsm_timeout(void);
  681. short    fsm_send(struct fsm_s *, b_8, b_8, struct bufheader *);
  682. short    fsm_sendreq(struct fsm_s *);
  683. void    fsm_proc(struct fsm_s *, struct bufheader *);
  684. void    fsm_open(struct fsm_s *);
  685. void    fsm_down(struct fsm_s *);
  686. void    fsm_close(struct fsm_s *);
  687. void    fsm_init(struct fsm_s *);
  688.  
  689. /* ppp.c */
  690. void    ppp_ready(LapInfo *);
  691. void    ppp_init(LapInfo *);
  692. short    ppp_iostatus(LapInfo *, short);
  693. void    htonppp(LapInfo *, b_16, struct bufheader *);
  694. short    proc_request(struct fsm_s *, struct config_hdr *, struct bufheader *);
  695. short    proc_ack(struct fsm_s *, struct config_hdr *, struct bufheader *);
  696. short    proc_nak(struct fsm_s *, struct config_hdr *, struct bufheader *);
  697. short    proc_reject(struct fsm_s *, struct config_hdr *, struct bufheader *);
  698. short    option_check(struct bufheader *, struct fsm_s *,
  699.                             struct option_hdr *, short);
  700. void    makeoptions(struct fsm_s *, struct bufheader *, union value_s *, b_16);
  701. void    add_option(struct fsm_s *, struct bufheader *, union value_s *,
  702.                         b_8, b_8, struct bufheader *);
  703. struct bufheader *makereq(struct fsm_s *);
  704.  
  705. /* link.c */
  706. void    link_open(LapInfo *);
  707. void    link_close();
  708.  
  709. /* asmutil.c */
  710. void    bzero(b_8 *, short);
  711. void    SetLAPPtr(LapInfo *);
  712. LapInfo    *GetLAPPtr(void);
  713. long    seta5(long);
  714. long    geta5(void);
  715. long    seta4(long);
  716. long    geta4(void);
  717. short    set_sr(short);
  718. short    get_sr(void);
  719.  
  720. /* io.c */
  721. void    RcvDeferred(void);
  722. void    XmtDeferred(void);
  723. void    TxCDeferred(void);
  724. ProcPtr hdlcrioc(void);
  725. ProcPtr    hdlcwioc(void);
  726. OSErr    QueueFrame(LapInfo *, struct bufheader *, struct ipbuf *);
  727. PPPiopb *get_iopb(LapInfo *);
  728. OSErr    readpkt(struct rdStruct *, Ptr, long);
  729. long    readrest(struct rdStruct *, Ptr, long);
  730. void    rcvip(LapInfo *, struct bufheader *);
  731. OSErr    xmit(sdiopb *, b_8 *, long);
  732. void    ProcRcvPPP(void);
  733. void    ProcXmtPPP(LapInfo *);
  734. void    XmtTMProc(void);
  735. void    IOCompleted(LapInfo *, struct ipbuf *);
  736. void    SerComplete(void);
  737. void    SerReadDone(void);
  738.  
  739. /* pap.c */
  740. short    pap_remote(LapInfo *);
  741. void    pap_down(struct fsm_s *);
  742. void    pap_proc(struct fsm_s *, struct bufheader *);
  743. OSErr    pap_userio(struct fsm_s *);
  744.  
  745. /* timer.c */
  746. void    set_timer(TMtimer *, struct fsm_s *, ProcPtr);
  747. void    start_timer(TMtimer *);
  748. void    stop_timer(TMtimer *);
  749.  
  750. #endif /* _PPP_H */
  751.